#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Time          : 2024/4/19 14:26
# File          : pandas_demo.py
# @Author       : MingTai


import numpy as np
import pandas as pd


# 使用iterrows() 迭代DataFrame的每一行
def aa1():
    # 创建一个DataFrame示例
    df = pd.DataFrame({
        'col1': [1, 2, 3],
        'col2': ['a', 'b', 'c']
    })

    # 使用iterrows()遍历DataFrame的每一行
    for index, row in df.iterrows():
        print(f'index={index},col1={row["col1"]},col2={row["col2"]}')


# 使用itertuples()遍历DataFrame的每一行
def aa2():
    """
    itertuples()是另一个生成器，它逐行迭代DataFrame，返回一个命名元组，代表每行的数据。itertuples()通常比iterrows()速度更快。
    :return:
    """
    # 创建一个DataFrame示例
    df = pd.DataFrame({
        'col1': [1, 2, 3],
        'col2': ['a', 'b', 'c']
    })

    # 使用itertuples()遍历DataFrame的每一行
    for row in df.itertuples():
        print(f'Index={row.Index},col1= {row.col1}, col2={row.col2}')


# Series操作
def aa3():
    # 创建DataFrame
    df = pd.DataFrame({'A': 1.,
                       'B': pd.Timestamp('20230101'),
                       'C': pd.Series(1, index=list(range(4)), dtype='float32'),
                       'D': np.array([3] * 4, dtype='int32'),
                       'E': pd.Categorical(["test", "train", "test", "train"]),
                       'F': 'foo'})

    # 操作列（Series）
    print(df['A'])  # 访问列
    df['G'] = df['D'] + 1  # 新增列，通过现有列进行计算
    print(df)

    df_new = df[df['E'] == 'test']
    print(df_new)
    in_scene = pd.Series(np.zeros(len(df), dtype=int), index=df.index)
    # in_scene[]
    print(in_scene)


# 遍历列
def aa4():
    # 创建一个简单的DataFrame作为示例
    df = pd.DataFrame({
        'col1': [1, 2, 3],
        'col2': ['a', 'b', 'c'],
        'col3': [4.1, 5.2, 6.3]
    })
    print(df)
    print(f'df.values={df.values}')
    # 一个大list装JSON对象，列名是key，行是values
    print(f'df.to_json，orient="records"={df.to_json(orient="records")}')
    # 一行一个list，然后放在大list中
    print(f'df.to_json，orient="values"={df.to_json(orient="values")}')
    # 信息比较详细
    print(f'df.to_json，orient="split"={df.to_json(orient="split")}')

    # 获取DataFrame的列名列表
    columns_list = df.columns.tolist()
    print(f'获取的列名={columns_list}')

    # 遍历列名，并获取每列的值作为列表，转换成字典
    columns_with_data = {col: df[col].tolist() for col in columns_list}

    print(f'columns_with_data={columns_with_data}')

    # 输出各列的数据列表，相当于遍历字典
    for col_name, col_data in columns_with_data.items():
        print(f'列名="{col_name}"，列的值={col_data}')


def aa5():
    # 创建一个原始 DataFrame
    df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})

    # 复制 DataFrame
    df_copy = df.copy()
    # 深复制意味着数据结构及其所有数据都会被复制，修改复制后的对象不会影响到原始对象
    # 修改复制后的 DataFrame 不会影响原始 DataFrame
    df_copy['col1'] = [5, 6]

    # 输出原始 DataFrame
    print(df)

    # 输出复制后的 DataFrame
    print(df_copy)


def aa6():
    pandas_data = {
        '123': [x for x in range(10)],
        'ccc': [x for x in range(20, 40, 2)],
        'gg': np.arange(10, 30, 2)
    }
    print(pandas_data)
    # columns需要与字典的key同名,这个只取123、ccc两个列
    new_data_two = pd.DataFrame(pandas_data, columns=['123', 'ccc'])
    # columns需要与字典的key同名,这个取3个列
    new_data_three = pd.DataFrame(pandas_data, columns=['123', 'ccc', 'gg'])
    print(new_data_two)
    print(new_data_three)
    # 得到一个新的列
    new_data_two['ddd'] = new_data_two['123'] / new_data_two['ccc']
    dd = new_data_two['123'] / new_data_two['ccc']
    # 列相除时，避免除零错误。
    ffff = np.where(new_data_two['123'] == 0, np.nan, new_data_two['ccc'] / new_data_two['123'])
    print(new_data_two)
    print(dd)
    print(ffff)


if __name__ == '__main__':
    aa6()
